package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.DatosNomina2DAO;
import mx.ipn.persistencia.dao.EmpleadoDAO;
import mx.ipn.to.DatosNominaTO;
import mx.ipn.to.EmpleadoTO;
import mx.ipn.to.FechaHoraTO;

public class DatosNominaDAOMySQL implements DatosNomina2DAO {
	static {
		FabricaDeDAOsMySQL.iniciaLog(CalleDAOMySQL.class);
	}

	private static final String INSERT = "INSERT INTO datos_nomina (fecha,horas_laboradas,dias_laborados,dias_vacaciones,faltas,inicio_periodo,fin_periodo,id_empleado) VALUES(?,?,?,?,?,?,?,?)";
	private static final String DELETE = "DELETE FROM datos_nomina";
	//private static final String UPDATE = "UPDATE datos_nomina SET fecha=?,horas_laboradas=?,dias_laborados=?,dias_vacaciones=?,faltas=?,inicio_periodo=?,fin_periodo=?,id_empleado=?  WHERE id_operacion=?";
	
	private static final String FINDBYFECHAINICIOTERMINOEMPLEADO = "SELECT * FROM datos_nomina WHERE inicio_periodo = ? AND fin_periodo = ? AND id_empleado = ?";
	private static final String FINDBYID = "SELECT * FROM datos_nomina WHERE id_operacion=?";

	private static final String SELECT = "SELECT * FROM datos_nomina";
	

	@Override
	public short deleteDatosNomina() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(DELETE);


			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			}

			else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

	@Override
	public DatosNominaTO findDatosNominaById(int idOperacion) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);

			ps.setInt(1, idOperacion);

			ResultSet rs = ps.executeQuery();
			if (rs.next()) {
				idOperacion = rs.getInt("id_operacion");
				Date fecha = rs.getDate("fecha");
				double horasLaboradas = rs.getDouble("horas_laboradas");
				int diasLaborados = rs.getInt("dias_laborados");
				int diasVacaciones = rs.getInt("dias_vacaciones");
				int faltas = rs.getInt("faltas");
				Date inicioPeriodo = rs.getDate("inicio_periodo");
				Date finPeriodo = rs.getDate("fin_periodo");
				EmpleadoDAO empleadoDAO = null;
				FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
						.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

				empleadoDAO = fabricaMySQL.getEmpleadoDAO();
				EmpleadoTO empleadoTO = empleadoDAO.findEmpleadoById(rs
						.getInt("id_empleado"));

				DatosNominaTO datosNominaTO = new DatosNominaTO(idOperacion,
						fecha, horasLaboradas, diasLaborados, diasVacaciones,
						faltas, inicioPeriodo, finPeriodo, empleadoTO);

				ps.close();
				conexion.close();
				return datosNominaTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public int insertDatosNomina(DatosNominaTO datosNominaTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setDate(1, FechaHoraTO.getFecha(datosNominaTO.getFecha()));
			ps.setDouble(2, datosNominaTO.getHorasLaboradas());
			ps.setInt(3, datosNominaTO.getDiasLaborados());
			ps.setInt(4, datosNominaTO.getDiasVacaciones());
			ps.setInt(5, datosNominaTO.getFaltas());
			ps.setDate(6, FechaHoraTO
					.getFecha(datosNominaTO.getInicioPeriodo()));
			ps.setDate(7, FechaHoraTO.getFecha(datosNominaTO.getFinPeriodo()));
			ps.setInt(8, datosNominaTO.getEmpleadoTO().getIdEmpleado());
			ps.executeUpdate();

			// atrapa el indice del campo agregado
			int autoIncIndice = -1;
			ResultSet rs = ps.getGeneratedKeys();

			if (rs.next()) {
				autoIncIndice = rs.getInt(1);
			} else {
				System.err.print("No se pudo agregar campo");
				return 0;
			}

			ps.close();
			conexion.close();

			return autoIncIndice;
		} catch (Exception e) {
			e.printStackTrace();
			return -1;
		}
	}

	@Override
	public ArrayList<DatosNominaTO> selectDatosNomina() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();

			ArrayList<DatosNominaTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<DatosNominaTO>();
				
				int idOperacion = rs.getInt("id_operacion");
				Date fecha = rs.getDate("fecha");
				double horasLaboradas = rs.getDouble("horas_laboradas");
				int diasLaborados = rs.getInt("dias_laborados");
				int diasVacaciones = rs.getInt("dias_vacaciones");
				int faltas = rs.getInt("faltas");
				Date inicioPeriodo = rs.getDate("inicio_periodo");
				Date finPeriodo = rs.getDate("fin_periodo");
				EmpleadoDAO empleadoDAO = null;
				FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
						.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

				empleadoDAO = fabricaMySQL.getEmpleadoDAO();
				EmpleadoTO empleadoTO = empleadoDAO.findEmpleadoById(rs
						.getInt("id_empleado"));

				DatosNominaTO datosNominaTO = new DatosNominaTO(idOperacion,
						fecha, horasLaboradas, diasLaborados, diasVacaciones,
						faltas, inicioPeriodo, finPeriodo, empleadoTO);

				coleccion.add(datosNominaTO);
				
			}

			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	
	@Override
	public DatosNominaTO findDatosNominaByFechaInicioFinEmpleado(
			Date fechaInicio, Date fechaFin, int idEmpleado) {
		
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYFECHAINICIOTERMINOEMPLEADO);

			ps.setDate(1, FechaHoraTO.getFecha(fechaInicio));
			ps.setDate(2, FechaHoraTO.getFecha(fechaFin));
			ps.setDate(3, FechaHoraTO.getFecha(fechaFin));
			
			ResultSet rs = ps.executeQuery();
			
			if (rs.next()) {
				int idOperacion = rs.getInt("id_operacion");
				Date fecha = rs.getDate("fecha");
				double horasLaboradas = rs.getDouble("horas_laboradas");
				int diasLaborados = rs.getInt("dias_laborados");
				int diasVacaciones = rs.getInt("dias_vacaciones");
				int faltas = rs.getInt("faltas");
				Date inicioPeriodo = rs.getDate("inicio_periodo");
				Date finPeriodo = rs.getDate("fin_periodo");
				EmpleadoDAO empleadoDAO = null;
				FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
						.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

				empleadoDAO = fabricaMySQL.getEmpleadoDAO();
				EmpleadoTO empleadoTO = empleadoDAO.findEmpleadoById(rs
						.getInt("id_empleado"));

				DatosNominaTO datosNominaTO = new DatosNominaTO(idOperacion,
						fecha, horasLaboradas, diasLaborados, diasVacaciones,
						faltas, inicioPeriodo, finPeriodo, empleadoTO);

				ps.close();
				conexion.close();
				return datosNominaTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}


	@Override
	public short updateDatosNomina(DatosNominaTO datosNominaTO) {
		// TODO Auto-generated method stub
		return 0;
	}

}
